package org.andengine.entity.particle;

import org.andengine.engine.camera.Camera;
import org.andengine.entity.IEntity;
import org.andengine.entity.IEntityFactory;
import org.andengine.entity.particle.emitter.IParticleEmitter;
import org.andengine.entity.shape.IShape;
import org.andengine.opengl.util.GLState;

/**
 * (c) Zynga 2012
 *
 * @author Nicolas Gramlich <ngramlich@zynga.com>
 * @since 11:34:32 - 10.05.2012
 */
public class BlendFunctionParticleSystem<T extends IEntity> extends ParticleSystem<T> {
    // ===========================================================
    // Constants
    // ===========================================================

    // ===========================================================
    // Fields
    // ===========================================================

    protected boolean mBlendingEnabled = true;
    protected int mBlendFunctionSource = IShape.BLENDFUNCTION_SOURCE_DEFAULT;
    protected int mBlendFunctionDestination = IShape.BLENDFUNCTION_DESTINATION_DEFAULT;

    // ===========================================================
    // Constructors
    // ===========================================================

    public BlendFunctionParticleSystem(IEntityFactory<T> pEntityFactory, IParticleEmitter pParticleEmitter, float pRateMinimum, float pRateMaximum, int pParticlesMaximum) {
        super(pEntityFactory, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum);
    }

    public BlendFunctionParticleSystem(float pX, float pY, IEntityFactory<T> pEntityFactory, IParticleEmitter pParticleEmitter, float pRateMinimum, float pRateMaximum, int pParticlesMaximum) {
        super(pX, pY, pEntityFactory, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum);
    }

    // ===========================================================
    // Getter & Setter
    // ===========================================================

    public boolean isBlendingEnabled() {
        return this.mBlendingEnabled;
    }

    public void setBlendingEnabled(final boolean pBlendingEnabled) {
        this.mBlendingEnabled = pBlendingEnabled;
    }

    public int getBlendFunctionSource() {
        return this.mBlendFunctionSource;
    }

    public void setBlendFunctionSource(final int pBlendFunctionSource) {
        this.mBlendFunctionSource = pBlendFunctionSource;
    }

    public int getBlendFunctionDestination() {
        return this.mBlendFunctionDestination;
    }

    public void setBlendFunctionDestination(final int pBlendFunctionDestination) {
        this.mBlendFunctionDestination = pBlendFunctionDestination;
    }

    public void setBlendFunction(final int pBlendFunctionSource, final int pBlendFunctionDestination) {
        this.mBlendFunctionSource = pBlendFunctionSource;
        this.mBlendFunctionDestination = pBlendFunctionDestination;
    }

    // ===========================================================
    // Methods for/from SuperClass/Interfaces
    // ===========================================================

    @Override
    protected void preDraw(final GLState pGLState, final Camera pCamera) {
        if (this.mBlendingEnabled) {
            pGLState.enableBlend();
            pGLState.blendFunction(this.mBlendFunctionSource, this.mBlendFunctionDestination);
        }
    }

    @Override
    protected void postDraw(final GLState pGLState, final Camera pCamera) {
        if (this.mBlendingEnabled) {
            pGLState.disableBlend();
        }
    }

    // ===========================================================
    // Methods
    // ===========================================================

    // ===========================================================
    // Inner and Anonymous Classes
    // ===========================================================
}
